<?php

namespace app\model\contract;

use app\model\BaseModel;

/**
 * 合同模板模型
 * 对应数据表：oa_contract_template
 */
class ContractTemplate extends BaseModel
{
    /**
     * 数据表名
     * @var string
     */
    protected $name = 'contract_template';

    /**
     * 主键名
     * @var string
     */
    protected $pk = 'id';

    /**
     * 字段类型转换
     * @var array
     */
    protected $type = [
        'id' => 'integer',
        'name' => 'string',
        'type' => 'integer',
        'content' => 'string',
        'status' => 'integer',
        'sort' => 'integer',
        'create_admin_id' => 'integer',
        'create_time' => 'integer',
        'update_time' => 'integer',
    ];

    /**
     * 可搜索字段
     * @var array
     */
    protected $searchField = ['name', 'content'];

    /**
     * 模板类型
     * @var array
     */
    public const TYPE = [
        1 => '通用合同',
        2 => '劳动合同',
        3 => '采购合同',
        4 => '销售合同',
        5 => '租赁合同',
        6 => '其他合同',
    ];

    /**
     * 模板状态
     * @var array
     */
    public const STATUS = [
        1 => '启用',
        0 => '禁用',
    ];

    /**
     * 关联创建者
     * @return \think\model\relation\BelongsTo
     */
    public function createAdmin()
    {
        return $this->belongsTo('app\model\admin\User', 'create_admin_id', 'id');
    }

    /**
     * 获取模板列表
     * @param array $params 查询参数
     * @return array
     */
    public function getTemplateList($params = [])
    {
        $where = [];
        
        if (!empty($params['type'])) {
            $where[] = ['type', '=', $params['type']];
        }
        
        if (isset($params['status']) && $params['status'] !== '') {
            $where[] = ['status', '=', $params['status']];
        }

        return $this->where($where)
            ->with(['createAdmin'])
            ->order('sort', 'asc')
            ->order('id', 'desc')
            ->paginate([
                'list_rows' => $params['limit'] ?? 15,
                'page' => $params['page'] ?? 1,
            ]);
    }

    /**
     * 获取启用的模板列表
     * @param int $type 模板类型
     * @return array
     */
    public function getActiveTemplates($type = null)
    {
        $where = [['status', '=', 1]];
        
        if ($type) {
            $where[] = ['type', '=', $type];
        }

        return $this->where($where)
            ->order('sort', 'asc')
            ->select()
            ->toArray();
    }

    /**
     * 创建模板
     * @param array $data 模板数据
     * @return bool
     */
    public function createTemplate($data)
    {
        $data['create_time'] = time();
        $data['update_time'] = time();
        
        return $this->save($data);
    }

    /**
     * 更新模板
     * @param int $id 模板ID
     * @param array $data 更新数据
     * @return bool
     */
    public function updateTemplate($id, $data)
    {
        $data['update_time'] = time();
        
        return $this->where('id', $id)->update($data);
    }

    /**
     * 删除模板
     * @param int|array $ids 模板ID
     * @return bool
     */
    public function deleteTemplate($ids)
    {
        if (is_array($ids)) {
            return $this->where('id', 'in', $ids)->delete();
        } else {
            return $this->where('id', $ids)->delete();
        }
    }

    /**
     * 切换模板状态
     * @param int $id 模板ID
     * @param int $status 状态值
     * @return bool
     */
    public function toggleStatus($id, $status)
    {
        return $this->where('id', $id)->update([
            'status' => $status,
            'update_time' => time()
        ]);
    }

    /**
     * 搜索器：按类型搜索
     * @param \think\db\Query $query
     * @param int $value
     */
    public function searchTypeAttr($query, $value)
    {
        $query->where('type', $value);
    }

    /**
     * 搜索器：按状态搜索
     * @param \think\db\Query $query
     * @param int $value
     */
    public function searchStatusAttr($query, $value)
    {
        $query->where('status', $value);
    }

    /**
     * 搜索器：按名称搜索
     * @param \think\db\Query $query
     * @param string $value
     */
    public function searchNameAttr($query, $value)
    {
        $query->where('name', 'like', '%' . $value . '%');
    }
}